Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


libs/able/testapps/bletest/main.py master (8b8a5035) Text, 8.54 KB

T8b949e"""Connect to "KivyBLETest" server and test various BLE functions
"""
Tff7b72import T7ee787time

Tff7b72from T7ee787able Tff7b72import Te6edf3AdapterStateTb4b4b4, Te6edf3GATT_SUCCESSTb4b4b4, Te6edf3BluetoothDispatcher
Tff7b72from T7ee787kivyT7ee787.T7ee787app Tff7b72import Te6edf3App
Tff7b72from T7ee787kivyT7ee787.T7ee787clock Tff7b72import Te6edf3Clock
Tff7b72from T7ee787kivyT7ee787.T7ee787config Tff7b72import Te6edf3Config
Tff7b72from T7ee787kivyT7ee787.T7ee787properties Tff7b72import Te6edf3BooleanPropertyTb4b4b4, Te6edf3StringProperty
Tff7b72from T7ee787kivyT7ee787.T7ee787uixT7ee787.T7ee787boxlayout Tff7b72import Te6edf3BoxLayout
Tff7b72from T7ee787kivyT7ee787.T7ee787storageT7ee787.T7ee787jsonstore Tff7b72import Te6edf3JsonStore

Te6edf3ConfigTff7b72.Td2a8ffsetTb4b4b4(Ta5d6ff'Ta5d6ffkivyTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6fflog_levelTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffdebugTa5d6ff'Tb4b4b4)
Te6edf3ConfigTff7b72.Td2a8ffsetTb4b4b4(Ta5d6ff'Ta5d6ffkivyTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6fflog_enableTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff1Ta5d6ff'Tb4b4b4)


Tff7b72class T56d364MainLayoutTb4b4b4(Te6edf3BoxLayoutTb4b4b4)Tb4b4b4:
Tff7b72pass


Tff7b72class T56d364BLETestAppTb4b4b4(Te6edf3AppTb4b4b4)Tb4b4b4:
Te6edf3ble Tff7b72= Te6edf3BluetoothDispatcherTb4b4b4(Tb4b4b4)
Te6edf3adapter_state Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4)
Te6edf3state Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4)
Te6edf3test_string Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4)
Te6edf3rssi Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4)
Te6edf3notification_value Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4)
Te6edf3counter_value Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4)
Te6edf3increment_count_value Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4)
Te6edf3incremental_interval Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff100Ta5d6ff'Tb4b4b4)
Te6edf3counter_max Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff128Ta5d6ff'Tb4b4b4)
Te6edf3counter_value Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4)
Te6edf3counter_state Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4)
Te6edf3counter_total_time Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4)
Te6edf3queue_timeout_enabled Tff7b72= Te6edf3BooleanPropertyTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3queue_timeout Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff1000Ta5d6ff'Tb4b4b4)
Te6edf3device_name Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ffKivyBLETestTa5d6ff'Tb4b4b4)
Te6edf3device_address Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4)
Te6edf3autoconnect Tff7b72= Te6edf3BooleanPropertyTb4b4b4(Tff7b72FalseTb4b4b4)

Te6edf3store Tff7b72= Te6edf3JsonStoreTb4b4b4(Ta5d6ff'Ta5d6ffbletestapp.jsonTa5d6ff'Tb4b4b4)

Te6edf3uids Tff7b72= Tb4b4b4{
Ta5d6ff'Ta5d6ffstringTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ff0d01Ta5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffcounter_resetTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ff0d02Ta5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffcounter_incrementTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ff0d03Ta5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffcounter_readTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ff0d04Ta5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffnotificationsTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ff0d05Ta5d6ff'
Tb4b4b4}

Tff7b72def Td2a8ffbuildTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstoreTff7b72.Td2a8ffexistsTb4b4b4(Ta5d6ff'Ta5d6ffdeviceTa5d6ff'Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdevice_address Tff7b72= Tff7b72selfTff7b72.Td2a8ffstoreTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffdeviceTa5d6ff'Tb4b4b4)Tb4b4b4[Ta5d6ff'Ta5d6ffaddressTa5d6ff'Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdevice_address Tff7b72= Ta5d6ff'Ta5d6ff'
Tff7b72return Te6edf3MainLayoutTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffon_pauseTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True

Tff7b72def Td2a8ffon_resumeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ffinitTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffset_queue_settingsTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_deviceTff7b72=Tff7b72selfTff7b72.Td2a8ffon_deviceTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_scan_startedTff7b72=Tff7b72selfTff7b72.Td2a8ffon_scan_startedTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_scan_completedTff7b72=Tff7b72selfTff7b72.Td2a8ffon_scan_completedTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_bluetooth_adapter_state_changeTff7b72=Tff7b72selfTff7b72.Td2a8ffon_bluetooth_adapter_state_changeTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffbindTb4b4b4(
Te6edf3on_connection_state_changeTff7b72=Tff7b72selfTff7b72.Td2a8ffon_connection_state_changeTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_servicesTff7b72=Tff7b72selfTff7b72.Td2a8ffon_servicesTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_characteristic_readTff7b72=Tff7b72selfTff7b72.Td2a8ffon_characteristic_readTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_characteristic_changedTff7b72=Tff7b72selfTff7b72.Td2a8ffon_characteristic_changedTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_rssi_updatedTff7b72=Tff7b72selfTff7b72.Td2a8ffon_rssi_updatedTb4b4b4)

Tff7b72def Td2a8ffstart_scanTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstateTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffinitTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Ta5d6ff'Ta5d6ffscan_startTa5d6ff'
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffclose_gattTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffstart_scanTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffconnect_by_mac_addressTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstoreTff7b72.Td2a8ffputTb4b4b4(Ta5d6ff'Ta5d6ffdeviceTa5d6ff'Tb4b4b4, Te6edf3addressTff7b72=Tff7b72selfTff7b72.Td2a8ffdevice_addressTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstateTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffinitTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Ta5d6ff'Ta5d6fftry_connectTa5d6ff'
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffclose_gattTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffconnect_by_device_addressTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffdevice_addressTb4b4b4,
Te6edf3autoconnectTff7b72=Tff7b72selfTff7b72.Td2a8ffautoconnectTb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149ValueError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Tffa657strTb4b4b4(Te6edf3excTb4b4b4)

Tff7b72def Td2a8ffon_scan_startedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bleTb4b4b4, Te6edf3successTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Ta5d6ff'Ta5d6ffscanTa5d6ff' Tff7b72if Te6edf3success Tff7b72else Ta5d6ff'Ta5d6ffscan_errorTa5d6ff'

Tff7b72def Td2a8ffon_deviceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bleTb4b4b4, Te6edf3deviceTb4b4b4, Te6edf3rssiTb4b4b4, Te6edf3advertisementTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstate Tff7b72!= Ta5d6ff'Ta5d6ffscanTa5d6ff'Tb4b4b4:
Tff7b72return
Tff7b72if Te6edf3deviceTff7b72.Td2a8ffgetNameTb4b4b4(Tb4b4b4) Tff7b72== Tff7b72selfTff7b72.Td2a8ffdevice_nameTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdevice Tff7b72= Te6edf3device
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Ta5d6ff'Ta5d6fffoundTa5d6ff'
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffstop_scanTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffon_scan_completedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bleTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdeviceTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffconnect_gattTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffdeviceTb4b4b4,
Te6edf3autoconnectTff7b72=Tff7b72selfTff7b72.Td2a8ffautoconnectTb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ffon_connection_state_changeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bleTb4b4b4, Te6edf3statusTb4b4b4, Te6edf3stateTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3status Tff7b72== Te6edf3GATT_SUCCESSTb4b4b4:
Tff7b72if Te6edf3stateTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffdiscover_servicesTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Ta5d6ff'Ta5d6ffdisconnectedTa5d6ff'
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Ta5d6ff'Ta5d6ffconnection_errorTa5d6ff'

Tff7b72def Td2a8ffon_servicesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bleTb4b4b4, Te6edf3statusTb4b4b4, Te6edf3servicesTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3status Tff7b72!= Te6edf3GATT_SUCCESSTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Ta5d6ff'Ta5d6ffservices_errorTa5d6ff'
Tff7b72return
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Ta5d6ff'Ta5d6ffconnectedTa5d6ff'
Tff7b72selfTff7b72.Td2a8ffservices Tff7b72= Te6edf3services
Tff7b72selfTff7b72.Td2a8ffread_test_stringTb4b4b4(Te6edf3bleTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcharacteristics Tff7b72= Tb4b4b4{
Ta5d6ff'Ta5d6ffcounter_incrementTa5d6ff'Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffservicesTff7b72.Td2a8ffsearchTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffuidsTb4b4b4[Ta5d6ff'Ta5d6ffcounter_incrementTa5d6ff'Tb4b4b4]Tb4b4b4)Tb4b4b4,
Ta5d6ff'Ta5d6ffcounter_resetTa5d6ff'Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffservicesTff7b72.Td2a8ffsearchTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffuidsTb4b4b4[Ta5d6ff'Ta5d6ffcounter_resetTa5d6ff'Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tb4b4b4}

Tff7b72def Td2a8ffon_bluetooth_adapter_state_changeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bleTb4b4b4, Te6edf3stateTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadapter_state Tff7b72= Te6edf3AdapterStateTb4b4b4(Te6edf3stateTb4b4b4)Tff7b72.Td2a8ffname

Tff7b72def Td2a8ffread_rssiTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrssi Tff7b72= Ta5d6ff'Ta5d6ff...Ta5d6ff'
Te6edf3result Tff7b72= Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffupdate_rssiTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffon_rssi_updatedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bleTb4b4b4, Te6edf3rssiTb4b4b4, Te6edf3statusTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrssi Tff7b72= Tffa657strTb4b4b4(Te6edf3rssiTb4b4b4) Tff7b72if Te6edf3status Tff7b72== Te6edf3GATT_SUCCESS Tff7b72else Ta5d6fffTa5d6ff"Ta5d6ffBad status: Tffd700{Te6edf3statusTffd700}Ta5d6ff"

Tff7b72def Td2a8ffread_test_stringTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bleTb4b4b4)Tb4b4b4:
Te6edf3characteristic Tff7b72= Tff7b72selfTff7b72.Td2a8ffservicesTff7b72.Td2a8ffsearchTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuidsTb4b4b4[Ta5d6ff'Ta5d6ffstringTa5d6ff'Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3characteristicTb4b4b4:
Te6edf3bleTff7b72.Td2a8ffread_characteristicTb4b4b4(Te6edf3characteristicTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftest_string Tff7b72= Ta5d6ff'Ta5d6ffnot foundTa5d6ff'

Tff7b72def Td2a8ffread_remote_counterTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3characteristic Tff7b72= Tff7b72selfTff7b72.Td2a8ffservicesTff7b72.Td2a8ffsearchTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuidsTb4b4b4[Ta5d6ff'Ta5d6ffcounter_readTa5d6ff'Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3characteristicTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffread_characteristicTb4b4b4(Te6edf3characteristicTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcounter_value Tff7b72= Ta5d6ff'Ta5d6fferrorTa5d6ff'

Tff7b72def Td2a8ffenable_notificationsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3enableTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3enableTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnotification_value Tff7b72= Ta5d6ff'Ta5d6ff0Ta5d6ff'
Te6edf3characteristic Tff7b72= Tff7b72selfTff7b72.Td2a8ffservicesTff7b72.Td2a8ffsearchTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuidsTb4b4b4[Ta5d6ff'Ta5d6ffnotificationsTa5d6ff'Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3characteristicTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffenable_notificationsTb4b4b4(Te6edf3characteristicTb4b4b4, Te6edf3enableTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnotification_value Tff7b72= Ta5d6ff'Ta5d6fferrorTa5d6ff'

Tff7b72def Td2a8ffenable_counterTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3enableTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3enableTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcounter_state Tff7b72= Ta5d6ff'Ta5d6ffinitTa5d6ff'
Te6edf3interval Tff7b72= Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffincremental_intervalTb4b4b4) Tff7b72* T79c0ff.001
Te6edf3ClockTff7b72.Td2a8ffschedule_intervalTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcounter_nextTb4b4b4, Te6edf3intervalTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3ClockTff7b72.Td2a8ffunscheduleTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcounter_nextTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcounter_state Tff7b72!= Ta5d6ff'Ta5d6ffstopTa5d6ff'Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcounter_state Tff7b72= Ta5d6ff'Ta5d6ffstopTa5d6ff'
Tff7b72selfTff7b72.Td2a8ffread_remote_counterTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffcounter_nextTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dtTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcounter_state Tff7b72== Ta5d6ff'Ta5d6ffinitTa5d6ff'Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcounter_started_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcounter_total_time Tff7b72= Ta5d6ff'Ta5d6ff'
Tff7b72selfTff7b72.Td2a8ffreset_remote_counterTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffincrement_remote_counterTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffcounter_state Tff7b72== Ta5d6ff'Ta5d6ffenabledTa5d6ff'Tb4b4b4:
Tff7b72if Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffincrement_count_valueTb4b4b4) Tff7b72< Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcounter_maxTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffincrement_remote_counterTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffenable_counterTb4b4b4(Tff7b72FalseTb4b4b4)

Tff7b72def Td2a8ffreset_remote_counterTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffincrement_count_value Tff7b72= Ta5d6ff'Ta5d6ff0Ta5d6ff'
Tff7b72selfTff7b72.Td2a8ffcounter_value Tff7b72= Ta5d6ff'Ta5d6ff'
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffwrite_characteristicTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcharacteristicsTb4b4b4[Ta5d6ff'Ta5d6ffcounter_resetTa5d6ff'Tb4b4b4]Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcounter_state Tff7b72= Ta5d6ff'Ta5d6ffenabledTa5d6ff'

Tff7b72def Td2a8ffon_characteristic_readTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bleTb4b4b4, Te6edf3characteristicTb4b4b4, Te6edf3statusTb4b4b4)Tb4b4b4:
Te6edf3uuid Tff7b72= Te6edf3characteristicTff7b72.Td2a8ffgetUuidTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fftoStringTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffuidsTb4b4b4[Ta5d6ff'Ta5d6ffstringTa5d6ff'Tb4b4b4] Tff7b72in Te6edf3uuidTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffupdate_string_valueTb4b4b4(Te6edf3characteristicTb4b4b4, Te6edf3statusTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffuidsTb4b4b4[Ta5d6ff'Ta5d6ffcounter_readTa5d6ff'Tb4b4b4] Tff7b72in Te6edf3uuidTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcounter_total_time Tff7b72= Tffa657strTb4b4b4(
Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Tff7b72selfTff7b72.Td2a8ffcounter_started_timeTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffupdate_counter_valueTb4b4b4(Te6edf3characteristicTb4b4b4, Te6edf3statusTb4b4b4)

Tff7b72def Td2a8ffupdate_string_valueTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3characteristicTb4b4b4, Te6edf3statusTb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Ta5d6ff'Ta5d6ffERRORTa5d6ff'
Tff7b72if Te6edf3status Tff7b72== Te6edf3GATT_SUCCESSTb4b4b4:
Te6edf3value Tff7b72= Te6edf3characteristicTff7b72.Td2a8ffgetStringValueTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72== Ta5d6ff'Ta5d6fftestTa5d6ff'Tb4b4b4:
Te6edf3result Tff7b72= Ta5d6ff'Ta5d6ffOKTa5d6ff'
Tff7b72selfTff7b72.Td2a8fftest_string Tff7b72= Te6edf3result

Tff7b72def Td2a8ffincrement_remote_counterTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3characteristic Tff7b72= Tff7b72selfTff7b72.Td2a8ffcharacteristicsTb4b4b4[Ta5d6ff'Ta5d6ffcounter_incrementTa5d6ff'Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffwrite_characteristicTb4b4b4(Te6edf3characteristicTb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Te6edf3prev_value Tff7b72= Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffincrement_count_valueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffincrement_count_value Tff7b72= Tffa657strTb4b4b4(Te6edf3prev_value Tff7b72+ T79c0ff1Tb4b4b4)

Tff7b72def Td2a8ffupdate_counter_valueTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3characteristicTb4b4b4, Te6edf3statusTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3status Tff7b72== Te6edf3GATT_SUCCESSTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcounter_value Tff7b72= Te6edf3characteristicTff7b72.Td2a8ffgetStringValueTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcounter_value Tff7b72= Ta5d6ff'Ta5d6ffERRORTa5d6ff'

Tff7b72def Td2a8ffset_queue_settingsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbleTff7b72.Td2a8ffset_queue_timeoutTb4b4b4(Tff7b72None Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffqueue_timeout_enabled
Tff7b72else Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffqueue_timeoutTb4b4b4) Tff7b72* T79c0ff.001Tb4b4b4)

Tff7b72def Td2a8ffon_characteristic_changedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bleTb4b4b4, Te6edf3characteristicTb4b4b4)Tb4b4b4:
Te6edf3uuid Tff7b72= Te6edf3characteristicTff7b72.Td2a8ffgetUuidTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fftoStringTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffuidsTb4b4b4[Ta5d6ff'Ta5d6ffnotificationsTa5d6ff'Tb4b4b4] Tff7b72in Te6edf3uuidTb4b4b4:
Te6edf3prev_value Tff7b72= Tff7b72selfTff7b72.Td2a8ffnotification_value
Te6edf3value Tff7b72= Tffa657intTb4b4b4(Te6edf3characteristicTff7b72.Td2a8ffgetStringValueTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3prev_value Tff7b72== Ta5d6ff'Ta5d6fferrorTa5d6ff'Tb4b4b4) Tff7b72or Tb4b4b4(Te6edf3value Tff7b72!= Tffa657intTb4b4b4(Te6edf3prev_valueTb4b4b4) Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4:
Te6edf3value Tff7b72= Ta5d6ff'Ta5d6fferrorTa5d6ff'
Tff7b72selfTff7b72.Td2a8ffnotification_value Tff7b72= Tffa657strTb4b4b4(Te6edf3valueTb4b4b4)


Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff'Ta5d6ff__main__Ta5d6ff'Tb4b4b4:
Te6edf3BLETestAppTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────